/**
 *  undefined 和 null 都代表没有，
 *  undefined： 应该有值， 但是此刻还没有。
 *  undefined 在进行数学计算的时候， 返回的是NaN
 *  null 在进行计算的时候，会转成 0
 *  1 定义但没初始化的参数
 *  2 对象的属性没有赋值， 进行访问
 *  3 函数的参数，在调用的时候没有赋值
 *  4 函数应当有返回值， 但是没有return
 *
 *
 *  null就是手动的定义为null
 *  1 在初始化某个变量， 手动的置为null
 *  2 作为原型链的终点
 *
 *  Object.assign({}, null)
 *  Object.prototype = null
 *  Object.setPrototype = null
 */


let a;
console.log(a)

let obj = {

}

console.log(obj.name)
// 打印一个对象中没有的属性

function objS(name) {
    console.log(name)
}
objS()

// 这里会打印两个undefined，
// 一个是调用方法时候出现的
// 二是打印这个没有返回值的函数
console.log(objS())


console.log('not a number',isNaN(undefined)) // true
console.log('a + undefined', 1+undefined) // NaN
console.log('not a null', isNaN(null)) // null 是0 ， null是一个数字， 但是undefined不是，undefined isNaN()
console.log('a + null', 1 + null) // 1


    // === null
// typeof 1 === 'number'
// { } instaneof Object